package com.yugao.fintech.antelope.mps.model.entity;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.yugao.fintech.antelope.base.model.BasePlusPO;
import com.yugao.fintech.antelope.mps.api.constatnts.MsgCons;
import com.yugao.fintech.antelope.base.tenant.core.DataIsolation;
import com.yugao.fintech.framework.core.annotations.FieldUnique;
import com.yugao.fintech.framework.core.annotations.FieldUniqueConfig;
import com.yugao.fintech.framework.core.enums.SqlConditionTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.List;

/**
 * 消息推送任务, 任务为消息实际发送场景
 *

 */
@Getter
@Setter
@TableName(value = "mps_msg_push_task", autoResultMap = true)
@FieldUniqueConfig(sqlCondition = SqlConditionTypeEnum.AND)
@DataIsolation(filterTenant = true, tableName = "mps_msg_push_task")
public class MsgPushTask extends BasePlusPO {
	private Long id;
	
	/**
	 * 任务编码
	 */
	@FieldUnique(message = "任务编码已存在")
	private String taskCode;

	/**
	 * 状态, 启用/禁用
	 */
	private String status;

	/**
	 * 接收者类型, 如果是会员通知, 则在代码中可以指定任意用户推送, 否则采用绑定的用户
	 * @see MsgCons.ReceiverType
	 */
	private String receiverType;
	
	/**
	 * 任务名称
	 */
	private String name;

	/**
	 * 消息功能组id
	 */
	private Long groupId;

	/**
	 * 消息任务使用的模板变量定义, json格式
	 * @deprecated
	 */
	@TableField(typeHandler = TemplateVarTypeHandler.class)
	private List<TemplateVarDefine> tplVarDefines;

	/**
	 * 是否被删除
	 */
	private String deleted;

    public static LambdaQueryWrapper<MsgPushTask> lqw() {
		return Wrappers.lambdaQuery();
	}

	/**
	 * 模板变量

	 */
	@Data
	public static class TemplateVarDefine implements Serializable {
		@ApiModelProperty(value = "变量文本(用于展示)")
		private String text;

		@ApiModelProperty(value = "变量名称(字段名称)")
		private String name;

		@ApiModelProperty(value = "颜色, 目前只有小程序推送才用到")
		private String color;
	}

	public static class TemplateVarTypeHandler extends AbstractJsonTypeHandler<List<TemplateVarDefine>> {

		@Override
		protected List<TemplateVarDefine> parse(String json) {
			return JSON.parseArray(json, TemplateVarDefine.class);
		}

		@Override
		protected String toJson(List<TemplateVarDefine> obj) {
			return JSON.toJSONString(obj).trim();
		}
	}
}
